/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package net.etrs.formathlon.vue.jsf.form.gest;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import net.etrs.formathlon.entity.formation.Domaine;
import net.etrs.formathlon.entity.formation.Formation;
import net.etrs.formathlon.entity.formation.Participation;
import net.etrs.formathlon.entity.utilisateur.Personnel;
import net.etrs.formathlon.persistance.formation.DomaineFacade;
import net.etrs.formathlon.persistance.formation.ParticipationFacade;
import net.etrs.formathlon.persistance.utilisateur.PersonnelFacade;
import net.etrs.formathlon.vue.jsf.utils.GeneralBean;
import org.apache.commons.lang.StringUtils;
import org.primefaces.model.DualListModel;

/**
 * Bean managé de la saisie des formateurs ayant participés à une session postérieure.
 * @author OPIF
 */
@ManagedBean
@ViewScoped
public class PostSessionBean extends GeneralBean {

    @EJB
    private ParticipationFacade participationFacade;
    @EJB
    private DomaineFacade domaineFacade;
    @EJB
    private PersonnelFacade personnelFacade;
    private List<Personnel> listParticipant;
    private List<Participation> listParticipation;
    private Domaine domaine;
    private Formation formation;
    private Date dateFormation;
    // Composant PrimeFaces
    private DualListModel<Personnel> pickListFormateur = new DualListModel<Personnel>();

    @PostConstruct
    public void init() {
        listParticipant = new ArrayList<Personnel>();
        listParticipation = new ArrayList<Participation>();

        // initialisation des listes du composant PrimeFaces
        pickListFormateur.setSource(personnelFacade.readAll());
        pickListFormateur.getTarget().clear();
    }

    /**
     * Méthode d'auto complétion.
     * @param nom
     * @return La liste des noms correspondant à l'auto-complete
     */
    public List<String> autoComplete(String nom) {
        List<String> retour = new ArrayList<String>();
        for (Personnel personnel : personnelFacade.readAll()) {
            if (StringUtils.startsWith(personnel.getNomComplet(), nom.toUpperCase())) {
                retour.add(personnel.getNomComplet());
            }
        }
        return retour;
    }

    /**
     * Enregistre pour chaque participant la formation à son parcours.
     */
    public void creer() {
        Participation participation;
        for (Personnel personnel : pickListFormateur.getTarget()) {
            participation = participationFacade.newInstance();
            participation.setDateFormation(dateFormation);
            participation.setFormation(formation);
            participation.setPersonnel(personnel);
            //verifier d'abord si la participation existe dans le parcours péda du gars !!
            if (personnelFacade.dejaParticipe(personnel, participation)) {
                participationFacade.update(participation);
            } else {
                personnel.getParcoursPeda().add(participation);
            }
            personnelFacade.update(personnel);
            listParticipation.add(participation);
        }
        init();
        displayMessage("Création réussie.");
    }

    /**
     * @return the listDomaine
     */
    public List<Domaine> getListDomaine() {
        return domaineFacade.getDomaineWithFormation();
    }

    /**
     * @return the listPariticipant
     */
    public List<Personnel> getListParticipant() {
        return listParticipant;
    }

    /**
     * @return the listParticipation
     */
    public List<Participation> getListParticipation() {
        return listParticipation;
    }

    /**
     * @return the domaine
     */
    public Domaine getDomaine() {
        return domaine;
    }

    /**
     * @param domaine the domaine to set
     */
    public void setDomaine(Domaine domaine) {
        this.domaine = domaine;
    }

    /**
     * 
     * @return pickListFormateur
     */
    public DualListModel<Personnel> getPickListFormateur() {
        return pickListFormateur;
    }

    /**
     * 
     * @param pickListFormateur 
     */
    public void setPickListFormateur(DualListModel<Personnel> pickListFormateur) {
        this.pickListFormateur = pickListFormateur;
    }

    /**
     * @return the formation
     */
    public Formation getFormation() {
        return formation;
    }

    /**
     * @param formation the formation to set
     */
    public void setFormation(Formation formation) {
        this.formation = formation;
    }

    /**
     * @return the dateFormation
     */
    public Date getDateFormation() {
        return dateFormation;
    }

    /**
     * @param dateFormation the dateFormation to set
     */
    public void setDateFormation(Date dateFormation) {
        this.dateFormation = dateFormation;
    }
}
